package com.zhisheng.day10_tlias.filter;

import com.alibaba.fastjson.JSONObject;
import com.zhisheng.day10_tlias.entry.R;
import com.zhisheng.day10_tlias.utils.MyJwtUtils;
import jakarta.annotation.Resource;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;

import java.io.IOException;
import java.util.Map;

/*
    我们自定义的过滤器,可以对浏览器发出的所有请求,先进行拦截,拦截之后,检查令牌,如果令牌有效,则放行,否则组织继续执行
 */
//@WebFilter(urlPatterns = {"/*"})
//@WebFilter(urlPatterns = {"/emps/*","/depts/*","/upload"})
//@Component // 如果加上这个注解,会导致这个类被扫描两次,会创建两个过滤器对象!!!
public class MyLoginFilter implements Filter {

    //@Autowired  // idea编译的时候,提示报错,但实际运行的时候没有问题,因此属于idea的误报!!!
    @Resource(name = "myJwtUtils")
    private MyJwtUtils jwtUtils;

    // 创建该类的对象的时候会执行的方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("保安上岗了...................................................................");
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //System.out.println("保安拦截了.........................................................");
        //request 代表请求对象
        // response 代表响应对象
        //chain 代表是否放行的控制对象
        // 请请求头中获取 令牌(token) ,并对令牌进行解析,如果解析成功,说明该浏览器已经登录过了,可以放行,否则,没有登陆,阻止访问
        HttpServletRequest resq = (HttpServletRequest)request;
        String uri = resq.getRequestURI();
        if("/login".equals(uri)){
            chain.doFilter(request,response);
            return;
        }
        String jwt = resq.getHeader("token");
        // 解析它
        Map<String, Object> map = jwtUtils.parseToken(jwt);
        if(map == null){
            // 说明令牌无效或没有令牌,阻止访问
            response.setContentType("application/json;charset=utf-8"); // 固定写法
            // 利用阿里的工具类将统一结果对象,转成json并响应
            R<Object> fail = R.fail("NOT_LOGIN");
            String jsonString = JSONObject.toJSONString(fail);
            response.getWriter().println(jsonString);
            return;
        }
        // 说明登陆过了,放行
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        System.out.println("保安下岗了.................................................");
        Filter.super.destroy();
    }
}
